# 链表是一种线性数据结构
# 链表的设计使得各个节点可以分散存储在内存各处，它们的内存地址无须连续
# 链表比数组占用更多的内存空间

# 初始化链表
class ListNode:
    """链表节点类"""
    def __init__(self, val: int):
        # self : 对应类被调用之后的返回结果 对应的就是14行的n0
        self.val: int = val               # 节点值
        self.next: ListNode | None = None # 指向下一节点的引用

#当一个类被调用时 默认执行的是类中定义的__init__函数
#__init__函数默认有一个参数self

# 类的执行结果是一个对象!
# 类型的执行结果有权利添加属性和方法
# n0 = ListNode(1)
# n1 = ListNode(3)
# n2 = ListNode(2)
# n3 = ListNode(5)
# n4 = ListNode(4)
# # 构建节点之间的引用
# n0.next = n1
# n1.next = n2
# n2.next = n3
# n3.next = n4


# 链表的插入
def insert(n0: ListNode, P: ListNode):
    """在链表的节点 n0 之后插入节点 P"""
    n1 = n0.next
    P.next = n1
    n0.next = P

# damu_node = ListNode(100)
# insert(n2,damu_node)
# print(damu_node.next == n3)

# 删除节点(删参数节点后面的节点)
def remove(n0: ListNode):
    """删除链表的节点 n0 之后的首个节点"""
    if not n0.next:
        return
    # n0 -> P -> n1
    P = n0.next
    n1 = P.next
    n0.next = n1

"""Driver Code"""
if __name__ == "__main__":
    # 初始化链表
    # 初始化各个节点
    n0 = ListNode(1)
    n1 = ListNode(3)
    n2 = ListNode(2)
    n3 = ListNode(5)
    n4 = ListNode(4)
    # 构建节点之间的引用
    n0.next = n1
    n1.next = n2
    n2.next = n3
    n3.next = n4

    # 删除节点
    remove(n4)